#include <string.h>
#include <memory>
#include <thread>
#include <functional>
#include <stdio.h>
#include <iostream>
#include <unistd.h>

/*
 * 线程可以被创建，自然也可以被关闭，可以使用 pthread_cancel 关闭已经创建并运行中的线程
 */


#define NUM 5

using namespace std;


void *threadRun(void *arg)
{
    const char *ps = static_cast<const char*>(arg);

    while(true)
    {
        cout << "线程 " << ps << " 正在运行" << endl;
        sleep(1);
    }

    pthread_exit((void*)10);
}

int main()
{
    pthread_t t;
    pthread_create(&t, nullptr, threadRun, (void*)"Hello Thread");

    // 3秒后关闭线程
    sleep(3);

    pthread_cancel(t);

    void *retval = nullptr;
    pthread_join(t, &retval);

    // 细节：使用 int64_t 而非 uint64_t
    cout << "线程 " << t << " 已退出，退出信息为 " << (int64_t)retval << endl;
    return 0;
}

#if 0

线程 Hello Thread 正在运行
线程 Hello Thread 正在运行
线程 Hello Thread 正在运行
线程 139951641405184 已退出，退出信息为 -1

程序运行 3 秒后，可以看到退出信息为 -1 ，与我们预设的 10 不相符


原因很简单：只要是被 pthread_cancel 关闭的线程，退出信息统一为 PTHREAD_CANCELED 即 -1
这也就解释了为什么要强转为 ingt64_t，因为无符号的 -1 非常大，不太好看

#define PTHREAD_CANCELED    ((void *) -1)


1.次线程可以自己关闭自己吗？

    答案是可以的，但貌似关闭后，主线程没有正常等待，整个进程一起正常结束(退出码为 0 )


2.次线程可以关闭主线程吗？

    答案是不可以，类似于 kill -9 无法终止 1 号进程

#endif
